package com.app.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

import static com.app.common.RabbitConst.*;

/**
 * 主题配置
 *
 * @author xiaoyu.fang
 * @date 2019/12/13 11:42
 */
@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue delayDirectQueue() {
        // 第一个参数是创建的queue的名字，第二个参数是 是否支持持久化
        return new Queue(DELAY_DIRECT_QUEUE, true);
    }

    @Bean
    public Queue delayQueue() {
        Map<String, Object> params = new HashMap<>();
        // x-dead-letter-exchange 声明了队列里的死信转发到的DLX名称，
        params.put("x-dead-letter-exchange", DELAY_DIRECT_EXCHANGE);
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的 routing-key 名称。
        params.put("x-dead-letter-routing-key", DELAY_DIRECT_ROUTING_KEY);
        return new Queue(DELAY_QUEUE_NAME, true, false, false, params);
    }

    @Bean
    public DirectExchange directExchange() {
        // 一共有三种构造方法，可以只传exchange的名字， 第二种，可以传exchange名字，是否支持持久化，是否可以自动删除，
        //第三种在第二种参数上可以增加Map，Map中可以存放自定义exchange中的参数
        return new DirectExchange(DELAY_DIRECT_EXCHANGE, true, false);
    }

    @Bean
    public DirectExchange deadLetterExchange() {
        // 一共有三种构造方法，可以只传exchange的名字， 第二种，可以传exchange名字，是否支持持久化，是否可以自动删除，
        //第三种在第二种参数上可以增加Map，Map中可以存放自定义exchange中的参数
        return new DirectExchange(DELAY_EXCHANGE, true, false);
    }

    @Bean
    public Binding directBinding() {
        return BindingBuilder.bind(delayDirectQueue()).to(directExchange()).with(DELAY_DIRECT_ROUTING_KEY);
    }

    @Bean
    public Binding delayBingding() {
        return BindingBuilder.bind(delayQueue()).to(deadLetterExchange()).with(DELAY_ROUTING_KEY);
    }
}
